package scala.test_class.test_generic_class

/**
 * @author 黄海峰 2021/4/19 15:07
 * */
object DeanTest {
  def main(args: Array[String]): Unit = {

  }
}

/**
 * 泛型类型的子类型是*不可传导*的。
 * 这表示如果我们有一个字母类型的栈 Stack[Char]，那它不能被用作一个整型的栈 Stack[Int]。否则就是不安全的，
 * 因为它将使我们能够在字母型的栈中插入真正的整型值。结论就是，只有当类型 B = A 时， Stack[A] 是 Stack[B] 的子类型才成立。
 *
 * 泛型任意字母都是可以的
 *
 * scala支持泛型类型参数的型变注释，允许他们是协变的，逆变的，或者在没有使用注释的情况下是不变的。
 *
 * [+A] 可以使一个泛型类的类型参数A变成协变。
 *      class List[+A] 意味着如果 A 是 B 的子类型，那么 List[A] 就是 List[B] 的子类型
 *
 * 注：以上的协变，对于继承 <extends> 就是默认如此；
 *
 * [-A] 逆变
 *    class Writer[-A] 意味着如果 A 是 B 的子类型，那么 Writer[B] 是 Writer[A] 的子类型。
 *
 * 注：一般逆变用于对抽象继承类的高度抽象；
 *
 * 类型上限：
 *      [T <: A] 这样的申明在类型上限表示类型 T 应该是类型 A 的子类；
 * 类型上限：
 *      [U >: B] 这样的申明表示类型下限 U 是类型 B 的超类型
 */